﻿using System;

namespace LAPI.Business.Acciones
{
    /// <summary>
    /// Clase para realizar la acción: Autenticar Usuario
    /// </summary>
    public class AccAutenticarUsuario
    {
        /// <summary>
        /// Logger de la clase
        /// </summary>
        private LAPI.Core.Logging.ILogger logger;

        /// <summary>
        /// Constructor
        /// </summary>
        public AccAutenticarUsuario()
        {
            logger = LAPI.Core.Logging.LoggerFactory.CreateLogger(type: typeof(AccAutenticarUsuario));
        }

        /// <summary>
        /// Método para realizar la acción de autenticar el usuario
        /// <p>
        /// El método realiza las siguientes funciones:
        /// <ul>
        /// <li>Comprueba que no falten datos necesarios para la autenticación</li>
        /// <li>Verifica que exista el par usuario/contraseña indicado en el modelo</li>       
        /// </ul>
        /// </p>
        /// </summary>
        /// <param name="datosUsuario">Modelo con los datos del usuario a autenticar</param>
        /// <returns>ResultadoAccion, con el resultado de la operación</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorUsuarios"/>
        /// <seealso cref="ResultadoAccion"/>
        /// <seealso cref="TipoResultado"/>
        /// <seealso cref="TipoMensaje"/>
        public ResultadoAccion AutenticarUsuario(LAPI.Data.Model.Usuario datosUsuario)
        {
            logger.Debug("[AutenticarUsuario] Comienzo");
            logger.Debug("[AutenticarUsuario] Datos:" + datosUsuario);

            ResultadoAccion res = new ResultadoAccion();

            try
            {
                //0. Comprobamos que no falten campos:             
                if (datosUsuario.User == null || String.Empty.Equals(datosUsuario.User))
                {
                    res.addMensaje(mensaje: "Debe indicar un usuario/contraseña correcto.", tipoMensaje: TipoMensaje.ALERTA);
                    res.setResultado(TipoResultado.ERROR);
                    return res;    
                }
                if (datosUsuario.Password == null || String.Empty.Equals(datosUsuario.Password))
                {
                    res.addMensaje(mensaje: "Debe indicar un usuario/contraseña correcto.", tipoMensaje: TipoMensaje.ALERTA);
                    res.setResultado(TipoResultado.ERROR);
                    return res;   
                }

                Gestores.GestorUsuarios oUsuarios = new Gestores.GestorUsuarios();
                //1. Verificamos que exista el usuario/contraseña
                LAPI.Data.Model.Usuario usuario = oUsuarios.ValidarCredencialesUsuario(usuario: datosUsuario.User, contrasena: datosUsuario.Password);
                if (usuario == null)
                {
                    res.addMensaje(mensaje: "Debe indicar un usuario/contraseña correcto.", tipoMensaje: TipoMensaje.ALERTA);
                    res.setResultado(TipoResultado.ERROR);
                    return res;
                }

                //TODO OK
                res.setResultado(TipoResultado.CORRECTO);
            }
            catch (Exception ex)
            {
                logger.Error(ex);
                res.addMensaje(mensaje: "No ha sido posible validar los datos para la autenticación del usuario.", tipoMensaje: TipoMensaje.ERROR);
                res.setResultado(TipoResultado.ERROR);
            }

            logger.Debug("[AutenticarUsuario] Fin");
            return res;
        }
    }
}
